{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "873f0765",
   "metadata": {},
   "source": [
    "## 多向量检索器\n",
    "\n",
    "每个文档存储多个向量通常是有益的。在许多用例中，这是有益的。 LangChain 有一个基础 MultiVectorRetriever ，这使得查询此类设置变得容易。很多复杂性在于如何为每个文档创建多个向量。本笔记本涵盖了创建这些向量和使用 MultiVectorRetriever 的一些常见方法。\n",
    "\n",
    "为每个文档创建多个向量的方法包括：\n",
    "- 较小的块：将文档分割成较小的块，然后嵌入这些块（这是 ParentDocumentRetriever）。\n",
    "- 摘要：为每个文档创建摘要，将其与文档一起嵌入（或代替文档）\n",
    "- 假设性问题：创建每个文档都适合回答的假设性问题，将这些问题与文档一起嵌入（或代替文档）。\n",
    "\n",
    "请注意，这还启用了另一种添加嵌入的方法 - 手动。这很棒，因为您可以显式添加导致文档恢复的问题或查询，从而为您提供更多控制权。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "70338ce6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.retrievers.multi_vector import MultiVectorRetriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c1a747d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.storage import InMemoryByteStore\n",
    "from langchain_community.document_loaders import TextLoader\n",
    "from langchain_community.vectorstores import Chroma\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "17c8f40f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<langchain_community.document_loaders.text.TextLoader at 0x14c05c42fe0>,\n",
       " <langchain_community.document_loaders.text.TextLoader at 0x14c05c41300>]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loaders = [\n",
    "    TextLoader(\"./txt/faq-4359.txt\",encoding=\"utf-8\"),\n",
    "    TextLoader(\"./txt/faq-7923.txt\",encoding=\"utf-8\"),\n",
    "]\n",
    "loaders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "90be0205",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。\\n\\n注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”\\n\\n\\n\\n二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。\\n\\n\\n\\n三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。\\n\\n\\n\\n\\n\\n四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？\\n\\n0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。\\n\\n\\n\\n五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。', metadata={'source': './txt/faq-4359.txt'}),\n",
       " Document(page_content='众测活动\\n\\n整体介绍：\\n\\n一、活动定义：众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。\\n\\n二、优势：众测价通常比较优惠，以不高于大促促销价为原则，最终以与物权方谈判结果为准。\\n\\n三、适用范围：华为商城所有产品。\\n\\n\\n\\n参与方式：\\n\\n1、华为商城众测的入口在哪里？\\n\\n华为商城搜索“众测”，即可看到众测入口，点击进入即可；\\n\\n2、众测上新频次：\\n\\n众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n\\n3、众测活动时间：\\n\\n一款产品众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n \\n\\n常见问题：\\n\\n1、众测商品的来源?\\n\\n     您好，众测商品主要来源为华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。\\n\\n2、众测商品的价格会优惠吗？\\n\\n     您好，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。\\n\\n3、 众测商品质量会不稳定么？\\n\\n     您好，众测商品也是量产的正品新品，质量与正式上架商品一致。 \\n\\n4、众测商品买下后多久发货？\\n\\n     您好，请以商品页显示为准。\\n\\n5、提交活动订单后多久内支付？\\n\\n     您好，提交订单后最长付款时效为24小时，逾期订单自动取消\\n\\n6、成功下单后怎么查询众测订单？\\n\\n     您好，成功下单后，您可以通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版任意一端登录下单账户，在“我的订单”查询。（众测商品订单查询方式等同于正常商品订单）\\n\\n7、订单支付后未发货前可以取消订单吗？\\n\\n     您好，在发货前消费者可以取消订单。\\n\\n8、取消订单后多久内退回款项？\\n\\n     您好，和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。\\n\\n9、一个账号可以参与几次众测活动？有限购吗？\\n\\n     您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。', metadata={'source': './txt/faq-7923.txt'})]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs = []\n",
    "for loader in loaders:\n",
    "    docs.extend(loader.load())\n",
    "\n",
    "docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "004980a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000)\n",
    "# docs = text_splitter.split_documents(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0b8d6af3",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\a4154\\AppData\\Roaming\\Python\\Python310\\site-packages\\transformers\\utils\\hub.py:124: FutureWarning: Using `TRANSFORMERS_CACHE` is deprecated and will be removed in v5 of Transformers. Use `HF_HOME` instead.\n",
      "  warnings.warn(\n",
      "d:\\ProgramData\\anaconda3\\lib\\site-packages\\torch\\_utils.py:776: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()\n",
      "  return self.fget.__get__(instance, owner)()\n"
     ]
    }
   ],
   "source": [
    "from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings\n",
    "embeddings_path = \"D:\\\\ai\\\\download\\\\bge-large-zh-v1.5\"\n",
    "embeddings = HuggingFaceEmbeddings(model_name=embeddings_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "18d8ae57",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用于索引子块的向量存储\n",
    "vectorstore = Chroma(\n",
    "    collection_name=\"full_documents\", embedding_function=embeddings\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "48ed6b62",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 父文档的存储层\n",
    "store = InMemoryByteStore()\n",
    "id_key = \"doc_id\"\n",
    "# 检索器（空启动）\n",
    "retriever = MultiVectorRetriever(\n",
    "    vectorstore=vectorstore,\n",
    "    byte_store=store,\n",
    "    id_key=id_key,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d3e378a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1177fa05-e477-432c-aa9f-2b070e130c32',\n",
       " '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import uuid\n",
    "\n",
    "doc_ids = [str(uuid.uuid4()) for _ in docs]\n",
    "doc_ids"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "4af0884a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import CharacterTextSplitter\n",
    "# 用于创建较小块的分割器\n",
    "child_text_splitter = CharacterTextSplitter(\n",
    "    separator=\"\\n\\n\",\n",
    "    chunk_size=100,\n",
    "    chunk_overlap=10,\n",
    "    length_function=len,\n",
    "    is_separator_regex=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a0d768e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Created a chunk of size 224, which is longer than the specified 100\n",
      "Created a chunk of size 117, which is longer than the specified 100\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '1177fa05-e477-432c-aa9f-2b070e130c32'}),\n",
       " Document(page_content='众测活动\\n\\n整体介绍：\\n\\n一、活动定义：众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='二、优势：众测价通常比较优惠，以不高于大促促销价为原则，最终以与物权方谈判结果为准。\\n\\n三、适用范围：华为商城所有产品。\\n\\n参与方式：\\n\\n1、华为商城众测的入口在哪里？', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='华为商城搜索“众测”，即可看到众测入口，点击进入即可；\\n\\n2、众测上新频次：\\n\\n众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n\\n3、众测活动时间：', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='3、众测活动时间：\\n\\n一款产品众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n \\n\\n常见问题：\\n\\n1、众测商品的来源?', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='1、众测商品的来源?\\n\\n     您好，众测商品主要来源为华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。\\n\\n2、众测商品的价格会优惠吗？', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='您好，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。\\n\\n3、 众测商品质量会不稳定么？\\n\\n     您好，众测商品也是量产的正品新品，质量与正式上架商品一致。', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='4、众测商品买下后多久发货？\\n\\n     您好，请以商品页显示为准。\\n\\n5、提交活动订单后多久内支付？\\n\\n     您好，提交订单后最长付款时效为24小时，逾期订单自动取消', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='6、成功下单后怎么查询众测订单？', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='您好，成功下单后，您可以通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版任意一端登录下单账户，在“我的订单”查询。（众测商品订单查询方式等同于正常商品订单）', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='7、订单支付后未发货前可以取消订单吗？\\n\\n     您好，在发货前消费者可以取消订单。\\n\\n8、取消订单后多久内退回款项？\\n\\n     您好，和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'}),\n",
       " Document(page_content='9、一个账号可以参与几次众测活动？有限购吗？\\n\\n     您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。', metadata={'source': './txt/faq-7923.txt', 'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8'})]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub_docs = []\n",
    "for i, doc in enumerate(docs):\n",
    "    _id = doc_ids[i]\n",
    "    _sub_docs = child_text_splitter.split_documents([doc])\n",
    "    for _doc in _sub_docs:\n",
    "        _doc.metadata[id_key] = _id\n",
    "    sub_docs.extend(_sub_docs)\n",
    "sub_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "5b748ed2",
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用一个名为retriever的对象来向一个向量存储（vectorstore）中添加文档，\n",
    "#并且使用一个文档存储（docstore）来设置文档ID与文档内容之间的映射。\n",
    "#这两个属性分别用于存储文档的向量化表示和文档的内容。\n",
    "retriever.vectorstore.add_documents(sub_docs)\n",
    "retriever.docstore.mset(list(zip(doc_ids, docs)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "d5080049",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(page_content='4、众测商品买下后多久发货？\\n\\n     您好，请以商品页显示为准。\\n\\n5、提交活动订单后多久内支付？\\n\\n     您好，提交订单后最长付款时效为24小时，逾期订单自动取消', metadata={'doc_id': '8f80d02b-6a27-46ae-ad6a-23cc6e1ec5c8', 'source': './txt/faq-7923.txt'})"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Vectorstore 单独检索小块\n",
    "retriever.vectorstore.similarity_search(\"众测商品多久发货呢？\")[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1832671",
   "metadata": {},
   "source": [
    "# 摘要总结\n",
    "通常，摘要可能能够更准确地提炼出某个块的内容，从而实现更好的检索。在这里，我们展示如何创建摘要，然后嵌入它们。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "708418ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "import uuid\n",
    "\n",
    "from langchain_core.documents import Document\n",
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_core.prompts import ChatPromptTemplate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "7b6c5a4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI, OpenAI\n",
    "openai_api_key = \"EMPTY\"\n",
    "openai_api_base = \"http://127.0.0.1:1234/v1\"\n",
    "model = ChatOpenAI(\n",
    "    openai_api_key=openai_api_key,\n",
    "    openai_api_base=openai_api_base,\n",
    "    temperature=0.3,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "64328c0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "chain = (\n",
    "    {\"doc\": lambda x: x.page_content}\n",
    "    | ChatPromptTemplate.from_template(\"总结下面的文档:\\n\\n{doc}\")\n",
    "    | model\n",
    "    | StrOutputParser()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "b1bc19ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。\\n\\n注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”\\n\\n\\n\\n二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。\\n\\n\\n\\n三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。\\n\\n\\n\\n\\n\\n四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？\\n\\n0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。\\n\\n\\n\\n五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。', metadata={'source': './txt/faq-4359.txt'}),\n",
       " Document(page_content='众测活动\\n\\n整体介绍：\\n\\n一、活动定义：众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。\\n\\n二、优势：众测价通常比较优惠，以不高于大促促销价为原则，最终以与物权方谈判结果为准。\\n\\n三、适用范围：华为商城所有产品。\\n\\n\\n\\n参与方式：\\n\\n1、华为商城众测的入口在哪里？\\n\\n华为商城搜索“众测”，即可看到众测入口，点击进入即可；\\n\\n2、众测上新频次：\\n\\n众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n\\n3、众测活动时间：\\n\\n一款产品众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n \\n\\n常见问题：\\n\\n1、众测商品的来源?\\n\\n     您好，众测商品主要来源为华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。\\n\\n2、众测商品的价格会优惠吗？\\n\\n     您好，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。\\n\\n3、 众测商品质量会不稳定么？\\n\\n     您好，众测商品也是量产的正品新品，质量与正式上架商品一致。 \\n\\n4、众测商品买下后多久发货？\\n\\n     您好，请以商品页显示为准。\\n\\n5、提交活动订单后多久内支付？\\n\\n     您好，提交订单后最长付款时效为24小时，逾期订单自动取消\\n\\n6、成功下单后怎么查询众测订单？\\n\\n     您好，成功下单后，您可以通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版任意一端登录下单账户，在“我的订单”查询。（众测商品订单查询方式等同于正常商品订单）\\n\\n7、订单支付后未发货前可以取消订单吗？\\n\\n     您好，在发货前消费者可以取消订单。\\n\\n8、取消订单后多久内退回款项？\\n\\n     您好，和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。\\n\\n9、一个账号可以参与几次众测活动？有限购吗？\\n\\n     您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。', metadata={'source': './txt/faq-7923.txt'})]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs = []\n",
    "for loader in loaders:\n",
    "    docs.extend(loader.load())\n",
    "\n",
    "docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0a1bc451",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['华为商城推出了一项名为“0分期利息”的活动，允许用户使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息，由华为商城承担。从2023年开始，商城将相关宣传调整为“0分期利息”，以符合监管机构关于分期业务规范的要求。目前，该活动仅支持部分单品参与，且不能与其他商品一起购买。用户需要在订单提交成功后在支付方式页面选择分期支付并确认0分期利息的支付方式和期数后完成支付。需要注意的是，华为商城小程序暂不支持0分期利息。',\n",
       " '华为商城众测活动是测试市场对新商品反应的一种低价试销形式，通过收集评价和销量来优化销售策略并引导商家改进。众测价通常优惠，不超过大促促销价原则，最终价格以与物权方谈判结果为准。所有产品都适用于华为商城的众测活动。\\n\\n参与方式：\\n1. 在华为商城搜索“众测”进入入口；\\n2. 众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n3. 一款产品的众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n常见问题：\\n1. 众测商品主要来源是华为商城上架的新品和爆款商品回归上线；\\n2. 众测商品价格对标618和双十一，一般是该商品某段时间的最低促销价；\\n3. 众测商品质量与正式上架商品一致；\\n4. 请以商品页显示为准；\\n5. 提交订单后最长付款时效为24小时，逾期订单自动取消；\\n6. 成功下单后可通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版查询众测订单（与正常商品订单查询方式相同）；\\n7. 在发货前消费者可以取消订单；\\n8. 取消订单后3-5个工作日内退回款项；\\n9. 一个账号参与众测活动的次数无限制，没有限购。每次只能购买一个商品，如需购买多个产品，可多次参与众测活动。']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summaries = chain.batch(docs, {\"max_concurrency\": 5})\n",
    "summaries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "6ffd690c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# The vectorstore to use to index the child chunks\n",
    "vectorstore = Chroma(collection_name=\"summaries\", embedding_function=embeddings)\n",
    "# The storage layer for the parent documents\n",
    "store = InMemoryByteStore()\n",
    "id_key = \"doc_id\"\n",
    "# The retriever (empty to start)\n",
    "retriever = MultiVectorRetriever(\n",
    "    vectorstore=vectorstore,\n",
    "    byte_store=store,\n",
    "    id_key=id_key,\n",
    ")\n",
    "doc_ids = [str(uuid.uuid4()) for _ in docs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c1354393",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='华为商城推出了一项名为“0分期利息”的活动，允许用户使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息，由华为商城承担。从2023年开始，商城将相关宣传调整为“0分期利息”，以符合监管机构关于分期业务规范的要求。目前，该活动仅支持部分单品参与，且不能与其他商品一起购买。用户需要在订单提交成功后在支付方式页面选择分期支付并确认0分期利息的支付方式和期数后完成支付。需要注意的是，华为商城小程序暂不支持0分期利息。', metadata={'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='华为商城众测活动是测试市场对新商品反应的一种低价试销形式，通过收集评价和销量来优化销售策略并引导商家改进。众测价通常优惠，不超过大促促销价原则，最终价格以与物权方谈判结果为准。所有产品都适用于华为商城的众测活动。\\n\\n参与方式：\\n1. 在华为商城搜索“众测”进入入口；\\n2. 众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n3. 一款产品的众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n常见问题：\\n1. 众测商品主要来源是华为商城上架的新品和爆款商品回归上线；\\n2. 众测商品价格对标618和双十一，一般是该商品某段时间的最低促销价；\\n3. 众测商品质量与正式上架商品一致；\\n4. 请以商品页显示为准；\\n5. 提交订单后最长付款时效为24小时，逾期订单自动取消；\\n6. 成功下单后可通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版查询众测订单（与正常商品订单查询方式相同）；\\n7. 在发货前消费者可以取消订单；\\n8. 取消订单后3-5个工作日内退回款项；\\n9. 一个账号参与众测活动的次数无限制，没有限购。每次只能购买一个商品，如需购买多个产品，可多次参与众测活动。', metadata={'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'})]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary_docs = [\n",
    "    Document(page_content=s, metadata={id_key: doc_ids[i]})\n",
    "    for i, s in enumerate(summaries)\n",
    "]\n",
    "summary_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "2a574347",
   "metadata": {},
   "outputs": [],
   "source": [
    "retriever.vectorstore.add_documents(summary_docs)\n",
    "retriever.docstore.mset(list(zip(doc_ids, docs)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "45410f17",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Number of requested results 4 is greater than number of elements in index 2, updating n_results = 2\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[Document(page_content='华为商城众测活动是测试市场对新商品反应的一种低价试销形式，通过收集评价和销量来优化销售策略并引导商家改进。众测价通常优惠，不超过大促促销价原则，最终价格以与物权方谈判结果为准。所有产品都适用于华为商城的众测活动。\\n\\n参与方式：\\n1. 在华为商城搜索“众测”进入入口；\\n2. 众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n3. 一款产品的众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n常见问题：\\n1. 众测商品主要来源是华为商城上架的新品和爆款商品回归上线；\\n2. 众测商品价格对标618和双十一，一般是该商品某段时间的最低促销价；\\n3. 众测商品质量与正式上架商品一致；\\n4. 请以商品页显示为准；\\n5. 提交订单后最长付款时效为24小时，逾期订单自动取消；\\n6. 成功下单后可通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版查询众测订单（与正常商品订单查询方式相同）；\\n7. 在发货前消费者可以取消订单；\\n8. 取消订单后3-5个工作日内退回款项；\\n9. 一个账号参与众测活动的次数无限制，没有限购。每次只能购买一个商品，如需购买多个产品，可多次参与众测活动。', metadata={'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='华为商城推出了一项名为“0分期利息”的活动，允许用户使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息，由华为商城承担。从2023年开始，商城将相关宣传调整为“0分期利息”，以符合监管机构关于分期业务规范的要求。目前，该活动仅支持部分单品参与，且不能与其他商品一起购买。用户需要在订单提交成功后在支付方式页面选择分期支付并确认0分期利息的支付方式和期数后完成支付。需要注意的是，华为商城小程序暂不支持0分期利息。', metadata={'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'})]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub_docs = retriever.vectorstore.similarity_search(\"众测活动是否有参与限制？\")\n",
    "sub_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9292aad8",
   "metadata": {},
   "source": [
    "## 假设查询\n",
    "LLM 还可用于生成针对特定文档可能提出的假设问题列表。然后可以嵌入这些问题\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "082641f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Created a chunk of size 224, which is longer than the specified 100\n",
      "Created a chunk of size 117, which is longer than the specified 100\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。', metadata={'source': './txt/faq-4359.txt', 'doc_id': '8a6959ea-ad9a-4df8-9181-232ea61dfaf7'}),\n",
       " Document(page_content='众测活动\\n\\n整体介绍：\\n\\n一、活动定义：众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='二、优势：众测价通常比较优惠，以不高于大促促销价为原则，最终以与物权方谈判结果为准。\\n\\n三、适用范围：华为商城所有产品。\\n\\n参与方式：\\n\\n1、华为商城众测的入口在哪里？', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='华为商城搜索“众测”，即可看到众测入口，点击进入即可；\\n\\n2、众测上新频次：\\n\\n众测频道每周一至周五不定期更新上架，部分商品可能会特别调整；\\n\\n3、众测活动时间：', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='3、众测活动时间：\\n\\n一款产品众测时间通常为10-20天（热销的商品可能会延期5-10天）。\\n\\n \\n\\n常见问题：\\n\\n1、众测商品的来源?', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='1、众测商品的来源?\\n\\n     您好，众测商品主要来源为华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。\\n\\n2、众测商品的价格会优惠吗？', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='您好，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。\\n\\n3、 众测商品质量会不稳定么？\\n\\n     您好，众测商品也是量产的正品新品，质量与正式上架商品一致。', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='4、众测商品买下后多久发货？\\n\\n     您好，请以商品页显示为准。\\n\\n5、提交活动订单后多久内支付？\\n\\n     您好，提交订单后最长付款时效为24小时，逾期订单自动取消', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='6、成功下单后怎么查询众测订单？', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='您好，成功下单后，您可以通过华为商城手机APP、华为商城手机WAP版、华为商城电脑网页版任意一端登录下单账户，在“我的订单”查询。（众测商品订单查询方式等同于正常商品订单）', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='7、订单支付后未发货前可以取消订单吗？\\n\\n     您好，在发货前消费者可以取消订单。\\n\\n8、取消订单后多久内退回款项？\\n\\n     您好，和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'}),\n",
       " Document(page_content='9、一个账号可以参与几次众测活动？有限购吗？\\n\\n     您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。', metadata={'source': './txt/faq-7923.txt', 'doc_id': 'e744378a-08d3-4d3a-8a49-379da403b901'})]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub_docs = []\n",
    "for i, doc in enumerate(docs):\n",
    "    _id = doc_ids[i]\n",
    "    _sub_docs = child_text_splitter.split_documents([doc])\n",
    "    for _doc in _sub_docs:\n",
    "        _doc.metadata[id_key] = _id\n",
    "    sub_docs.extend(_sub_docs)\n",
    "sub_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "13e68ab4",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_core.output_parsers import JsonOutputParser\n",
    "promptStr = '''\n",
    "```\n",
    "{doc}\n",
    "```\n",
    "\n",
    "根据上面的文档，生成3个相关问题和回答。响应以json列表的结构返回。返回的结构参考如下\n",
    "```\n",
    "[\n",
    "{{\"question\":\"问题1\",\"answer\":\"回答1\"}},\n",
    "{{\"question\":\"问题2\",\"answer\":\"回答2\"}},\n",
    "{{\"question\":\"问题3\",\"answer\":\"回答3\"}}\n",
    "]\n",
    "```\n",
    "'''\n",
    "\n",
    "prompt = ChatPromptTemplate.from_template(promptStr)\n",
    "\n",
    "chain = (\n",
    "    {\"doc\": lambda x: x.page_content}\n",
    "    | prompt\n",
    "    | model\n",
    "    | JsonOutputParser()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "e491d768",
   "metadata": {},
   "outputs": [],
   "source": [
    "hypothetical_questions = chain.batch(sub_docs, {\"max_concurrency\": 5})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "a700d88c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[{'question': '什么是0分期利息？',\n",
       "   'answer': '0分期利息是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。'},\n",
       "  {'question': '哪些渠道支持0分期利息？',\n",
       "   'answer': '支持0分期利息的渠道包括花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物。'},\n",
       "  {'question': '0分期利息由谁承担？', 'answer': '0分期利息由华为商城承担。'}],\n",
       " [{'question': \"为什么商城将相关宣传从'免息'调整为'0分期利息'？\",\n",
       "   'answer': '主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求银行业金融机构在分期业务合同和业务办理页面以明显方式展示所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。'},\n",
       "  {'question': '调整后的宣传方式有什么变化？',\n",
       "   'answer': \"调整后，商城将相关宣传从'免息'调整为'0分期利息'，主要变化是在展示分期业务收取的资金使用成本时，统一采用利息形式，并明确相应的计息规则。\"},\n",
       "  {'question': '调整后的宣传方式有什么优势？',\n",
       "   'answer': '调整后的宣传方式更加清晰明了地展示了分期业务的资金使用成本和年化利率水平，有利于客户更清楚地了解相关费用和风险，保障客户的知情权和选择权。'}],\n",
       " [{'question': '哪些商品可以参与0分期利息活动？', 'answer': '目前仅支持部分单品参与0分期利息，后续会逐渐开放更多商品。'},\n",
       "  {'question': '如果购买多件商品，其中一件不支持0分期利息，是否会影响其他商品的0分期利息资格？',\n",
       "   'answer': '是的，若多商品（含不支持0分期利息）合并支付则不支持0分期利息。'},\n",
       "  {'question': '如何查看哪些商品可以参与0分期利息活动？', 'answer': '在支付页面可以查看是否支持0分期利息。'}],\n",
       " [{'question': '订单提交成功后，如何选择分期支付？', 'answer': '在支付方式页面选择分期支付。'},\n",
       "  {'question': '如何在分期支付中选择0利息的分期方案？',\n",
       "   'answer': '点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。'},\n",
       "  {'question': '如何确认订单分期成功？',\n",
       "   'answer': '订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。'}],\n",
       " [{'question': '为什么订单中有多个商品，但只有部分商品支持0分期利息？',\n",
       "   'answer': '这是因为不同商品的优惠政策和条件可能有所不同。有些商品可能提供0分期利息，而其他商品则不提供。请仔细检查每个商品的详细信息和条款，以了解其具体优惠政策。'},\n",
       "  {'question': '如何确保订单中的所有商品都支持0分期利息？',\n",
       "   'answer': '如果您希望确保所有商品都支持0分期利息，建议您在购买前仔细检查每个商品的详细信息和条款，并选择符合条件的商品。如果您的订单中包含不支持0分期利息的商品，您可能需要将其替换为其他符合条件的商品。'},\n",
       "  {'question': '如何申请0分期利息？',\n",
       "   'answer': '要申请0分期利息，请在结账时选择相应的付款方式，并确保您的订单中包含支持0分期利息的商品。如果您的订单符合条件，您将看到0分期利息选项，并在提交订单后享受该优惠。请注意，不同商家和平台的规则可能有所不同，具体以实际操作为准。'}],\n",
       " [{'question': '为什么0分期利息商品不能和其他商品一起购买？',\n",
       "   'answer': '如果与其他商品一起购买，则无法享受0分期利息优惠。建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买。'},\n",
       "  {'question': '0分期利息的分期数是否固定？',\n",
       "   'answer': '是的，0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。'},\n",
       "  {'question': '如何购买0分期利息商品才能享受优惠？',\n",
       "   'answer': '需要将0分期利息商品和其他商品分开单独购买，以避免无法享受0分期利息优惠的情况发生。'}],\n",
       " [{'question': '华为商城小程序是否支持0分期利息？', 'answer': '不支持。根据文档，华为商城小程序暂不支持0分期利息。'},\n",
       "  {'question': '除了华为商城小程序，还有哪些平台支持0分期利息？',\n",
       "   'answer': '此问题需要进一步查询相关平台或咨询其官方客服获取准确信息。'},\n",
       "  {'question': '如果我想在华为商城购买商品并享受0分期利息，是否可以与客服沟通？',\n",
       "   'answer': '您可以在华为商城小程序联系客服，询问是否有其他优惠活动或者能否为您提供特殊处理。但根据文档，目前华为商城小程序暂不支持0分期利息。'}],\n",
       " [{'question': '什么是众测？',\n",
       "   'answer': '众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。'},\n",
       "  {'question': '众测活动的目的是什么？',\n",
       "   'answer': '众测活动的目的是测试市场对新商品的反应，及时优化销售策略和引导商家改进。'},\n",
       "  {'question': '众测活动对商家有什么好处？',\n",
       "   'answer': '众测活动可以帮助商家了解新产品在市场的受欢迎程度，从而调整销售策略，并收集用户反馈来改进产品。'}],\n",
       " [{'question': '什么是华为商城众测？',\n",
       "   'answer': '华为商城众测是一种产品测试和体验活动，用户可以以优惠的价格购买产品进行试用，并提供反馈和建议。'},\n",
       "  {'question': '华为商城众测的优势是什么？',\n",
       "   'answer': '众测价通常比较优惠，不高于大促促销价为原则，最终价格取决于与物权方的谈判结果。'},\n",
       "  {'question': '华为商城众测的适用范围有哪些产品？', 'answer': '华为商城所有产品都适用于众测活动。'}],\n",
       " [{'question': '如何进入华为众测频道？', 'answer': '在华为商城搜索‘众测’，即可看到众测入口，点击进入即可。'},\n",
       "  {'question': '华为众测频道的上新频次是怎样的？', 'answer': '众测频道每周一至周五不定期更新上架，部分商品可能会特别调整。'},\n",
       "  {'question': '华为众测活动的举办时间是什么时候？', 'answer': '暂未提供具体活动时间信息，建议关注众测频道的动态更新。'}],\n",
       " [{'question': '众测活动时间通常为多久？', 'answer': '10-20天（热销的商品可能会延期5-10天）'},\n",
       "  {'question': '众测商品的来源是什么？', 'answer': '没有提供相关信息。'},\n",
       "  {'question': '常见问题有哪些？', 'answer': '1、众测商品的来源?'}],\n",
       " [{'question': '众测商品的来源是什么？',\n",
       "   'answer': '您好，众测商品主要来源于华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。'},\n",
       "  {'question': '众测商品的价格会优惠吗？',\n",
       "   'answer': '众测商品通常以免费试用的方式提供给用户，用户只需要在规定时间内完成测评报告即可获得该商品。因此，众测商品本身并没有价格优惠。'},\n",
       "  {'question': '如何参加众测活动？',\n",
       "   'answer': '您可以在华为商城或华为官方微信公众号等渠道关注和参与众测活动。具体报名方式和条件可能因不同活动而有所差异，建议您仔细阅读相关活动的规则和要求。'}],\n",
       " [{'question': '众测商品价格是否与618和双十一促销价相当？',\n",
       "   'answer': '是的，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。'},\n",
       "  {'question': '众测商品的质量是否稳定？', 'answer': '众测商品也是量产的正品新品，质量与正式上架商品一致。'},\n",
       "  {'question': '如何保证众测商品的质量？', 'answer': '众测商品是经过严格筛选和测试的，确保其质量和性能符合标准。'}],\n",
       " [{'question': '众测商品买下后多久发货？', 'answer': '您好，请以商品页显示为准。'},\n",
       "  {'question': '提交活动订单后多久内支付？', 'answer': '您好，提交订单后最长付款时效为24小时，逾期订单自动取消'},\n",
       "  {'question': '众测商品买下后多久发货？', 'answer': '您好，请以商品页显示为准。'}],\n",
       " [{'question': '如何查询众测订单？',\n",
       "   'answer': '您可以在京东众测官网（www.jd.com/zhengce）的『我的众测』页面中查看您的众测订单。'},\n",
       "  {'question': '在哪儿可以找到京东众测官网？',\n",
       "   'answer': '您可以访问京东主站（www.jd.com），在顶部导航栏选择『更多服务』，然后点击『京东众测』进入。'},\n",
       "  {'question': '如果对订单有疑问，可以联系谁？',\n",
       "   'answer': '如果您对您的众测订单有任何问题或疑虑，您可以随时通过京东客服与我们联系（https://service.jd.com/）。'}],\n",
       " [{'question': '如何查询我的华为商城订单？',\n",
       "   'answer': '您可以登录华为商城手机APP、华为商城手机WAP版或华为商城电脑网页版，在‘我的订单’中进行查询。'},\n",
       "  {'question': '众测商品的订单查询方式与正常商品订单是否相同？', 'answer': '是的，众测商品订单查询方式等同于正常商品订单。'},\n",
       "  {'question': '如果我忘记了我的华为商城账户密码怎么办？',\n",
       "   'answer': '您可以尝试在登录页面点击‘忘记密码’，按照提示进行操作来重置您的密码。'}],\n",
       " [{'question': '在发货前，消费者是否可以取消订单？', 'answer': '是的，在发货前消费者可以取消订单。'},\n",
       "  {'question': '取消订单后多久内退回款项？', 'answer': '和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。'},\n",
       "  {'question': '请问是否有其他相关问题或信息需要了解的？',\n",
       "   'answer': '如果您还有其他问题，请随时告诉我，我会尽力为您解答。'}],\n",
       " [{'question': '一个账号可以参与几次众测活动？有限购吗？',\n",
       "   'answer': '您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。'},\n",
       "  {'question': '如果我想购买多个产品，该怎么办？',\n",
       "   'answer': '如果您想购买多个产品，您可以多次参与众测活动，每次下单一个商品即可。'},\n",
       "  {'question': '每次订单只能购买一个商品吗？',\n",
       "   'answer': '是的，每次订单只能购买一个商品。如果需要购买多个产品，请多次参与众测活动。'}]]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hypothetical_questions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "9b7637a2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='问：什么是0分期利息？\\n答：0分期利息是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。'),\n",
       " Document(page_content='问：哪些渠道支持0分期利息？\\n答：支持0分期利息的渠道包括花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物。'),\n",
       " Document(page_content='问：0分期利息由谁承担？\\n答：0分期利息由华为商城承担。'),\n",
       " Document(page_content=\"问：为什么商城将相关宣传从'免息'调整为'0分期利息'？\\n答：主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求银行业金融机构在分期业务合同和业务办理页面以明显方式展示所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。\"),\n",
       " Document(page_content=\"问：调整后的宣传方式有什么变化？\\n答：调整后，商城将相关宣传从'免息'调整为'0分期利息'，主要变化是在展示分期业务收取的资金使用成本时，统一采用利息形式，并明确相应的计息规则。\"),\n",
       " Document(page_content='问：调整后的宣传方式有什么优势？\\n答：调整后的宣传方式更加清晰明了地展示了分期业务的资金使用成本和年化利率水平，有利于客户更清楚地了解相关费用和风险，保障客户的知情权和选择权。'),\n",
       " Document(page_content='问：哪些商品可以参与0分期利息活动？\\n答：目前仅支持部分单品参与0分期利息，后续会逐渐开放更多商品。'),\n",
       " Document(page_content='问：如果购买多件商品，其中一件不支持0分期利息，是否会影响其他商品的0分期利息资格？\\n答：是的，若多商品（含不支持0分期利息）合并支付则不支持0分期利息。'),\n",
       " Document(page_content='问：如何查看哪些商品可以参与0分期利息活动？\\n答：在支付页面可以查看是否支持0分期利息。'),\n",
       " Document(page_content='问：订单提交成功后，如何选择分期支付？\\n答：在支付方式页面选择分期支付。'),\n",
       " Document(page_content='问：如何在分期支付中选择0利息的分期方案？\\n答：点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。'),\n",
       " Document(page_content='问：如何确认订单分期成功？\\n答：订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。'),\n",
       " Document(page_content='问：为什么订单中有多个商品，但只有部分商品支持0分期利息？\\n答：这是因为不同商品的优惠政策和条件可能有所不同。有些商品可能提供0分期利息，而其他商品则不提供。请仔细检查每个商品的详细信息和条款，以了解其具体优惠政策。'),\n",
       " Document(page_content='问：如何确保订单中的所有商品都支持0分期利息？\\n答：如果您希望确保所有商品都支持0分期利息，建议您在购买前仔细检查每个商品的详细信息和条款，并选择符合条件的商品。如果您的订单中包含不支持0分期利息的商品，您可能需要将其替换为其他符合条件的商品。'),\n",
       " Document(page_content='问：如何申请0分期利息？\\n答：要申请0分期利息，请在结账时选择相应的付款方式，并确保您的订单中包含支持0分期利息的商品。如果您的订单符合条件，您将看到0分期利息选项，并在提交订单后享受该优惠。请注意，不同商家和平台的规则可能有所不同，具体以实际操作为准。'),\n",
       " Document(page_content='问：为什么0分期利息商品不能和其他商品一起购买？\\n答：如果与其他商品一起购买，则无法享受0分期利息优惠。建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买。'),\n",
       " Document(page_content='问：0分期利息的分期数是否固定？\\n答：是的，0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。'),\n",
       " Document(page_content='问：如何购买0分期利息商品才能享受优惠？\\n答：需要将0分期利息商品和其他商品分开单独购买，以避免无法享受0分期利息优惠的情况发生。'),\n",
       " Document(page_content='问：华为商城小程序是否支持0分期利息？\\n答：不支持。根据文档，华为商城小程序暂不支持0分期利息。'),\n",
       " Document(page_content='问：除了华为商城小程序，还有哪些平台支持0分期利息？\\n答：此问题需要进一步查询相关平台或咨询其官方客服获取准确信息。'),\n",
       " Document(page_content='问：如果我想在华为商城购买商品并享受0分期利息，是否可以与客服沟通？\\n答：您可以在华为商城小程序联系客服，询问是否有其他优惠活动或者能否为您提供特殊处理。但根据文档，目前华为商城小程序暂不支持0分期利息。'),\n",
       " Document(page_content='问：什么是众测？\\n答：众测是以低价试销的形式，通过收集评价、销量等方法，用于测试市场对新商品的反应，用于及时优化销售策略和引导商家改进。'),\n",
       " Document(page_content='问：众测活动的目的是什么？\\n答：众测活动的目的是测试市场对新商品的反应，及时优化销售策略和引导商家改进。'),\n",
       " Document(page_content='问：众测活动对商家有什么好处？\\n答：众测活动可以帮助商家了解新产品在市场的受欢迎程度，从而调整销售策略，并收集用户反馈来改进产品。'),\n",
       " Document(page_content='问：什么是华为商城众测？\\n答：华为商城众测是一种产品测试和体验活动，用户可以以优惠的价格购买产品进行试用，并提供反馈和建议。'),\n",
       " Document(page_content='问：华为商城众测的优势是什么？\\n答：众测价通常比较优惠，不高于大促促销价为原则，最终价格取决于与物权方的谈判结果。'),\n",
       " Document(page_content='问：华为商城众测的适用范围有哪些产品？\\n答：华为商城所有产品都适用于众测活动。'),\n",
       " Document(page_content='问：如何进入华为众测频道？\\n答：在华为商城搜索‘众测’，即可看到众测入口，点击进入即可。'),\n",
       " Document(page_content='问：华为众测频道的上新频次是怎样的？\\n答：众测频道每周一至周五不定期更新上架，部分商品可能会特别调整。'),\n",
       " Document(page_content='问：华为众测活动的举办时间是什么时候？\\n答：暂未提供具体活动时间信息，建议关注众测频道的动态更新。'),\n",
       " Document(page_content='问：众测活动时间通常为多久？\\n答：10-20天（热销的商品可能会延期5-10天）'),\n",
       " Document(page_content='问：众测商品的来源是什么？\\n答：没有提供相关信息。'),\n",
       " Document(page_content='问：常见问题有哪些？\\n答：1、众测商品的来源?'),\n",
       " Document(page_content='问：众测商品的来源是什么？\\n答：您好，众测商品主要来源于华为商城上架的新品，热销的爆款商品也会不定期通过众测回归上线。'),\n",
       " Document(page_content='问：众测商品的价格会优惠吗？\\n答：众测商品通常以免费试用的方式提供给用户，用户只需要在规定时间内完成测评报告即可获得该商品。因此，众测商品本身并没有价格优惠。'),\n",
       " Document(page_content='问：如何参加众测活动？\\n答：您可以在华为商城或华为官方微信公众号等渠道关注和参与众测活动。具体报名方式和条件可能因不同活动而有所差异，建议您仔细阅读相关活动的规则和要求。'),\n",
       " Document(page_content='问：众测商品价格是否与618和双十一促销价相当？\\n答：是的，众测商品价格对标618和双十一，一般都是该商品某段时间的最低促销价。'),\n",
       " Document(page_content='问：众测商品的质量是否稳定？\\n答：众测商品也是量产的正品新品，质量与正式上架商品一致。'),\n",
       " Document(page_content='问：如何保证众测商品的质量？\\n答：众测商品是经过严格筛选和测试的，确保其质量和性能符合标准。'),\n",
       " Document(page_content='问：众测商品买下后多久发货？\\n答：您好，请以商品页显示为准。'),\n",
       " Document(page_content='问：提交活动订单后多久内支付？\\n答：您好，提交订单后最长付款时效为24小时，逾期订单自动取消'),\n",
       " Document(page_content='问：众测商品买下后多久发货？\\n答：您好，请以商品页显示为准。'),\n",
       " Document(page_content='问：如何查询众测订单？\\n答：您可以在京东众测官网（www.jd.com/zhengce）的『我的众测』页面中查看您的众测订单。'),\n",
       " Document(page_content='问：在哪儿可以找到京东众测官网？\\n答：您可以访问京东主站（www.jd.com），在顶部导航栏选择『更多服务』，然后点击『京东众测』进入。'),\n",
       " Document(page_content='问：如果对订单有疑问，可以联系谁？\\n答：如果您对您的众测订单有任何问题或疑虑，您可以随时通过京东客服与我们联系（https://service.jd.com/）。'),\n",
       " Document(page_content='问：如何查询我的华为商城订单？\\n答：您可以登录华为商城手机APP、华为商城手机WAP版或华为商城电脑网页版，在‘我的订单’中进行查询。'),\n",
       " Document(page_content='问：众测商品的订单查询方式与正常商品订单是否相同？\\n答：是的，众测商品订单查询方式等同于正常商品订单。'),\n",
       " Document(page_content='问：如果我忘记了我的华为商城账户密码怎么办？\\n答：您可以尝试在登录页面点击‘忘记密码’，按照提示进行操作来重置您的密码。'),\n",
       " Document(page_content='问：在发货前，消费者是否可以取消订单？\\n答：是的，在发货前消费者可以取消订单。'),\n",
       " Document(page_content='问：取消订单后多久内退回款项？\\n答：和华为商城智能家居生态产品通用退款时效一致，3-5个工作日。'),\n",
       " Document(page_content='问：请问是否有其他相关问题或信息需要了解的？\\n答：如果您还有其他问题，请随时告诉我，我会尽力为您解答。'),\n",
       " Document(page_content='问：一个账号可以参与几次众测活动？有限购吗？\\n答：您好，一个账号参与众测活动的次数无限制，没有限购。但每次订单只能购买一个商品。如您需要购买多个产品，可以多次参与众测活动。'),\n",
       " Document(page_content='问：如果我想购买多个产品，该怎么办？\\n答：如果您想购买多个产品，您可以多次参与众测活动，每次下单一个商品即可。'),\n",
       " Document(page_content='问：每次订单只能购买一个商品吗？\\n答：是的，每次订单只能购买一个商品。如果需要购买多个产品，请多次参与众测活动。')]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "documents = []\n",
    "for item in hypothetical_questions:\n",
    "    for obj in item:\n",
    "        content = \"问：{}\\n答：{}\".format(obj['question'],obj['answer'])\n",
    "        documents.append(Document(page_content=content))\n",
    "documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "d37e6ca8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# The vectorstore to use to index the child chunks\n",
    "vectorstore = Chroma(collection_name=\"Question\", embedding_function=embeddings,persist_directory=\"./vector_store\")\n",
    "# The storage layer for the parent documents\n",
    "store = InMemoryByteStore()\n",
    "id_key = \"doc_id\"\n",
    "# The retriever (empty to start)\n",
    "retriever = MultiVectorRetriever(\n",
    "    vectorstore=vectorstore,\n",
    "    byte_store=store,\n",
    "    id_key=id_key,\n",
    ")\n",
    "doc_ids = [str(uuid.uuid4()) for _ in docs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "d1a47d83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['d174736c-dfdc-11ee-ad0c-e00af6642b58',\n",
       " 'd174736d-dfdc-11ee-a4c9-e00af6642b58',\n",
       " 'd174736e-dfdc-11ee-9963-e00af6642b58',\n",
       " 'd174736f-dfdc-11ee-af3a-e00af6642b58',\n",
       " 'd1747370-dfdc-11ee-8390-e00af6642b58',\n",
       " 'd1747371-dfdc-11ee-8f18-e00af6642b58',\n",
       " 'd1747372-dfdc-11ee-8431-e00af6642b58',\n",
       " 'd1747373-dfdc-11ee-b079-e00af6642b58',\n",
       " 'd1747374-dfdc-11ee-a9af-e00af6642b58',\n",
       " 'd1747375-dfdc-11ee-824a-e00af6642b58',\n",
       " 'd1747376-dfdc-11ee-9b3a-e00af6642b58',\n",
       " 'd1747377-dfdc-11ee-86de-e00af6642b58',\n",
       " 'd1747378-dfdc-11ee-8f1d-e00af6642b58',\n",
       " 'd1747379-dfdc-11ee-9e24-e00af6642b58',\n",
       " 'd174737a-dfdc-11ee-ae67-e00af6642b58',\n",
       " 'd174737b-dfdc-11ee-878f-e00af6642b58',\n",
       " 'd174737c-dfdc-11ee-8930-e00af6642b58',\n",
       " 'd174737d-dfdc-11ee-b7f0-e00af6642b58',\n",
       " 'd174737e-dfdc-11ee-af46-e00af6642b58',\n",
       " 'd174737f-dfdc-11ee-92c5-e00af6642b58',\n",
       " 'd1747380-dfdc-11ee-8c4d-e00af6642b58',\n",
       " 'd1747381-dfdc-11ee-9cf7-e00af6642b58',\n",
       " 'd1747382-dfdc-11ee-9185-e00af6642b58',\n",
       " 'd1747383-dfdc-11ee-9e76-e00af6642b58',\n",
       " 'd1747384-dfdc-11ee-93a4-e00af6642b58',\n",
       " 'd1747385-dfdc-11ee-ad02-e00af6642b58',\n",
       " 'd1747386-dfdc-11ee-8678-e00af6642b58',\n",
       " 'd1747387-dfdc-11ee-ad47-e00af6642b58',\n",
       " 'd1747388-dfdc-11ee-9113-e00af6642b58',\n",
       " 'd1747389-dfdc-11ee-8025-e00af6642b58',\n",
       " 'd174738a-dfdc-11ee-b87a-e00af6642b58',\n",
       " 'd174738b-dfdc-11ee-9b5d-e00af6642b58',\n",
       " 'd174738c-dfdc-11ee-a8fd-e00af6642b58',\n",
       " 'd174738d-dfdc-11ee-bd4d-e00af6642b58',\n",
       " 'd174738e-dfdc-11ee-9124-e00af6642b58',\n",
       " 'd174738f-dfdc-11ee-bfc2-e00af6642b58',\n",
       " 'd1747390-dfdc-11ee-ba95-e00af6642b58',\n",
       " 'd1747391-dfdc-11ee-869a-e00af6642b58',\n",
       " 'd1747392-dfdc-11ee-8678-e00af6642b58',\n",
       " 'd1747393-dfdc-11ee-9545-e00af6642b58',\n",
       " 'd1747394-dfdc-11ee-8572-e00af6642b58',\n",
       " 'd1747395-dfdc-11ee-ab88-e00af6642b58',\n",
       " 'd1747396-dfdc-11ee-96ec-e00af6642b58',\n",
       " 'd1747397-dfdc-11ee-a73b-e00af6642b58',\n",
       " 'd1747398-dfdc-11ee-bd68-e00af6642b58',\n",
       " 'd1747399-dfdc-11ee-bb31-e00af6642b58',\n",
       " 'd174739a-dfdc-11ee-a454-e00af6642b58',\n",
       " 'd174739b-dfdc-11ee-bb24-e00af6642b58',\n",
       " 'd174739c-dfdc-11ee-a936-e00af6642b58',\n",
       " 'd174739d-dfdc-11ee-9eb7-e00af6642b58',\n",
       " 'd174739e-dfdc-11ee-aaa0-e00af6642b58',\n",
       " 'd174739f-dfdc-11ee-8806-e00af6642b58',\n",
       " 'd17473a0-dfdc-11ee-9225-e00af6642b58',\n",
       " 'd17473a1-dfdc-11ee-8017-e00af6642b58']"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "retriever.vectorstore.add_documents(documents)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "ec5f8c5d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(page_content='问：众测商品买下后多久发货？\\n答：您好，请以商品页显示为准。')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "retriever.vectorstore.similarity_search(\"众测商品多久发货呢？\")[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f66179ac",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
